package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IApplyToProgDAO;
import org.jsola.hr.dto.ApplyToProgAddDTO;
import org.jsola.hr.dto.ApplyToProgEmpeeInfoDTO;
import org.jsola.hr.dto.ApplyToProgUpdateDTO;
import org.jsola.hr.entity.ApplyToProgDO;
import org.jsola.hr.query.ApplyToProgQuery;
import org.jsola.hr.vo.ApplyToProgListVO;
import org.jsola.hr.vo.ApplyToProgVO;
import org.jsola.hr.vo.EmpInfoVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * @author zhr
 */
public interface IApplyToProgService extends IService<IApplyToProgDAO, ApplyToProgDO> {

    /**
     * 新增方案适用设置
     * @param applyToProgAddDTO 新增方案适用设置DTO
     * @param tokenUser 当前用户
     * @return 方案适用设置详情信息
     */
    ApplyToProgVO save(ApplyToProgAddDTO applyToProgAddDTO, TokenUser tokenUser);

    /**
     * 新增方案适用设置
     * @param applyToProgAddDTO 新增方案适用设置DTO
     * @param tokenUser 当前用户
     * @return 方案适用设置详情信息
     */
    Object add(ApplyToProgAddDTO applyToProgAddDTO, TokenUser tokenUser);

    /**
     * 修改方案适用设置
     * @param applyToProgUpdateDTO 修改方案适用设置DTO
     * @param tokenUser 当前用户
     * @return 更新数量 或 重复的员工
     */
    Object update(ApplyToProgUpdateDTO applyToProgUpdateDTO, TokenUser tokenUser);

    /**
     * 验证当前方案的适用的有效员工
     * @param isDepValid   部门选项是否生效
     * @param depEmpIds    符合所选部门员工id数组
     * @param isPosValid   岗位选项是否生效
     * @param posIds       符合所选岗位员工id数组
     * @param isLevelValid 职级选项是否生效
     * @param levelIds     符合所选职级员工id数组
     * @param siteId       站点id
     * @param companyId    公司Id
     * @return  生效的员工
     */
     List<String> validateEmpValid(Boolean isDepValid, List<String> depEmpIds , Boolean isPosValid, List<String> posIds,
                                         Boolean isLevelValid, List<String> levelIds, String siteId, String companyId);

    /**
     *  验证当前方案将要生效的员工是否和其余方案有冲突
     * @param empIds    要生效的员工id数组
     * @param busProgId  业务方案id（当是修改时必穿，添加方案时可不穿）
     * @param busProgType   业务方案类型
     * @param siteId     站点id
     * @return        冲突的员工
     */
     List<EmpInfoVO> validateConflicted(List<String> empIds, String busProgId, String busProgType, String siteId, String companyId);

    /**
     * 批量删除方案适用设置，物理删除，更新is_valid字段，从回收站删除
     * @param tokenUser 当前用户
     * @param applyToProgIds 方案适用设置id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String...applyToProgIds);

    /**
     * 根据方案适用设置id查找
     * @param applyToProgId 方案适用设置id
     * @param siteId 所属站点id
     * @return 方案适用设置详情信息
     */
    ApplyToProgVO selectById(String applyToProgId, String siteId);

    /**
     * 根据业务方案id查询方案适用设置
     * @param busProgId 业务方案id
     * @param siteId    所属站点id
     * @return 方案适用设置信息详情
     */
    ApplyToProgVO selectByBusProgId(String busProgId,String siteId);

    /**
     * 查询方案适用设置
     * @param applyToProgQuery 查询条件
     * @param siteId 所属站点id
     * @return 方案适用设置列表信息
     */
    List<ApplyToProgListVO> select(ApplyToProgQuery applyToProgQuery, String siteId);

    /**
    * 查询方案适用设置记录数
    * @param applyToProgQuery 查询条件
    * @param siteId 所属站点id
    * @return 方案适用设置记录数
    */
    int selectCount(ApplyToProgQuery applyToProgQuery, String siteId);

    /**
     * 分页查询方案适用设置
     * @param applyToProgQuery 查询条件
     * @param siteId 所属站点id
     * @return 方案适用设置列表信息
     */
    Page<ApplyToProgListVO> selectPage(ApplyToProgQuery applyToProgQuery, String siteId);


    /**
     * 根据方案适用设置id查找
     * @param applyToProgId 方案适用设置id
     * @param siteId 所属站点id
     * @return 方案适用设置
     */
    ApplyToProgDO selectDOById(String applyToProgId, String siteId);

    /**
     * 查询方案适用设置
     * @param applyToProgQuery 查询条件
     * @param siteId 所属站点id
     * @return 方案适用设置列表
     */
    List<ApplyToProgDO> selectDO(ApplyToProgQuery applyToProgQuery, String siteId);

    /**
     * 查询业务方案id适用员工
     * @param  busProgType 业务类型
     * @param siteId 站点id
     * @return 适用的员工
     */
    List<ApplyToProgEmpeeInfoDTO> getApplyToProgEmployee(String busProgType, String siteId, String companyId);

    /**
     * 根据业务方案id查询适用员工
     * @param busProgId 业务方案id
     * @param siteId 站点id
     * @return  适用员工
     */
    ApplyToProgEmpeeInfoDTO  getApplyToProgEmployeeByBusProgId(String busProgId,String siteId, String companyId);
}


